/**
 * @description 日期时间格式化
 * @param {String | Date | Number)} dateInput 时间 （支持Date、日期字符串、时间戳）
 * @param {String} format 格式化字符串 (eg. 'YYYY-MM-dd HH:mm:ss' || 'MM-dd' || 'HH:mm')
 * @returns {String} 格式化后的日期时间字符串
 */
interface DateTimeFormat {
	(dateInput: string | Date | number, format: string): string;
}

const dateTimeFormat: DateTimeFormat = (dateInput, format) => {
	// 判断是否为有效的日期字符串
	if (typeof dateInput === 'string' && !Date.parse(dateInput)) {
		throw new Error(`Invalid date string: ${dateInput}`);
	}

	let date: Date;
	if (!(dateInput instanceof Date)) {
		// 尝试将输入转换为Date实例
		date = new Date(dateInput);
		// 如果转换失败，抛出异常
		if (isNaN(date.getTime())) {
			throw new Error(`Invalid date number: ${dateInput}`);
		}
	} else {
		date = dateInput;
	}

	const padZero = (num: number): string => ('0' + num).slice(-2);
	const getPart = (unit: string): string => {
		const mapping: { [key: string]: () => string } = {
			yyyy: () => date.getFullYear().toString(),
			MM: () => padZero(date.getMonth() + 1),
			dd: () => padZero(date.getDate()),
			HH: () => padZero(date.getHours()),
			mm: () => padZero(date.getMinutes()),
			ss: () => padZero(date.getSeconds()),
		};

		if (mapping[unit]) {
			return mapping[unit]().toString();
		} else {
			// 处理不支持的格式单位，返回空字符串而不是抛出错误
			console.warn(`Unsupported format unit: ${unit}`);
			return '';
		}
	};

	// 使用预编译的正则表达式匹配所有可能的日期和时间单位
	const regex = /(yyyy|MM|dd|HH|mm|ss)/g;
	return format.replace(regex, getPart);
};
export default dateTimeFormat;
